package com.czm.art_light.config;

import com.czm.art_light.constant.AmqpConsts;
import org.springframework.amqp.core.*;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * AMQP 配置类
 */
@Configuration
public class AmqpConfig {
    /**
     * 死信交换机
     */
    @Bean
    public DirectExchange directExchange() {
        //SpringAMQP声明的交换机都是持久化
        return new DirectExchange(AmqpConsts.artWorksMq.DIE_EXCHANGE);
    }

    /**
     * 死信队列
     */
    @Bean
    public Queue deadQueue() {
        //SpringAMQP声明的队列都是持久化
        return new Queue(AmqpConsts.artWorksMq.DIE_QUEUE, true);
    }

    /**
     * 死信绑定
     */
    @Bean
    public Binding deadBinding() {
        //死信交换机和死信队列绑定，routingKey为死信
        return BindingBuilder.bind(deadQueue()).to(directExchange()).with(AmqpConsts.artWorksMq.DIE_ROUTING_KEY);
    }

    /**
     * 艺术作品信息改变 交换机
     */
    @Bean
    public FanoutExchange artWorksChangeExchange() {
        //SpringAMQP声明的交换机都是持久化
        return new FanoutExchange(AmqpConsts.artWorksMq.ART_WORK_INFO_CHANGE_EXCHANGE);
    }

    /**
     * 艺术作品信息改变 队列
     */
    @Bean
    public Queue artWorksChangeQueue() {
        //SpringAMQP声明的队列都是持久化
        return QueueBuilder.durable(AmqpConsts.artWorksMq.ART_WORK_INFO_CHANGE_QUEUE)
                // 设置队列的超时时间，10秒
                .ttl(AmqpConsts.artWorksMq.DIE_QUEUE_TTL)
                //绑定死信交换机
                .deadLetterExchange(AmqpConsts.artWorksMq.DIE_EXCHANGE)
                // 死信routingKey
                .deadLetterRoutingKey(AmqpConsts.artWorksMq.DIE_ROUTING_KEY)
                .build();

    }

    /**
     * 艺术作品信息改变 绑定
     */
    @Bean
    public Binding artWorksChangeBinding() {
        //艺术作品信息改变交换机和艺术作品信息改变队列绑定
        return BindingBuilder.bind(artWorksChangeQueue()).to(artWorksChangeExchange());
    }
}
